package cn.qn.service.user;

import cn.qn.base.PageVO;
import cn.qn.dto.user.*;
import cn.qn.exceptions.BizException;
import cn.qn.moudle.user.AppUser;

import java.util.List;

/**
 * @author: Bryant
 * @date: 2019/7/15
 * @description: 注册用户相关接口
 */
public interface AppUserService {

    /**
     * 通过用户编号查询用户信息
     *
     * @param userId
     * @return
     */
    AppUser findByUserId(String userId);

    /**
     * 通过手机号码查询用户信息
     *
     * @param mobile
     * @return
     */
    AppUser findByMobile(String mobile);

    /**
     * 注册创建用户
     * @param dto
     * @return
     */
    AppUser createAppUser(RegisterDTO dto) throws BizException;

    /**
     * 检查手机号码是否存在
     * @param mobile
     * @return true 存在 false 不存在
     */
    boolean checkMobileExist(String mobile);

    /**
     * 关注所有平台账号
     */
    void attentionPlatformUser(String userId);

    /**
     * 关注所有平台账号
     */
    void attentionByNormalUser(String attentionId);

    /**
     * 分页查询APP用户列表
     * @param query
     * @return
     */
    PageVO<AppUserDTO> pageQueryAppUsers(AppUserQueryDTO query);

    /**
     * App用户列表详情
     * @param userId
     * @return
     */
    AppUserDTO queryDetailById(String userId);

    /**
     * 修改状态
     * @param dto
     */
    void editStatus(AppUserDTO dto) throws BizException;

    /**
     * 添加平台用户
     * @param dto
     */
    AppUser addPlatAppUser(AppUserAddDTO dto);

    /**
     * 修改平台用户
     * @param dto
     * @return
     */
    AppUser editPlatAppUser(AppUserEditDTO dto);

    /**
     * 重置密码
     * @param dto
     */
    void resetPassword(AppUserResetPwdDTO dto);

    /**
     * 查询平台用户列表
     * @return
     */
    List<AppUser> queryPlatUserList();

    /**
     * 查询我关注的用户
     * @param userId
     * @return
     */
    List<AppUserAttentionDTO> queryMyAttentions(String userId);

    /**
     * 查询3条我关注的用户
     * @param userId
     * @return
     */
    List<AppUserAttentionDTO> queryMyThreeAttentions(String userId);

    /**
     * 关注指定用户
     * @param userId 用户编号
     * @param attentionId  被关注的人的用户编号
     */
    void attentionOneUser(String userId, String attentionId) throws BizException;

    /**
     * 取消关注指定用户
     * @param userId 用户编号
     * @param attentionId  被关注的人的用户编号
     */
    void cancleAttentionOneUser(String userId, String attentionId) throws BizException;

    /**
     * 查询我关注的所有用户的编号
     * @param userId
     * @return
     */
    List<String> queryAttionUserIds(String userId);

    /**
     * 关注数
     * @param userId
     * @return
     */
    Integer countByUserId(String userId);

    /**
     * 粉丝数
     * @param userId
     * @return
     */
    Integer countByAttentionId(String userId);

    /**
     * 通过手机号码修改密码
     * @param mobile
     * @param password
     */
    void resetAppPassword(String mobile, String password);

    void editAppUser(AppUser appUser);
}
